#include "cpu/exec/template-start.h"

#define instr call

make_helper(concat(call_i_, SUFFIX)) {
    int len = concat(decode_i_, SUFFIX) (eip + 1);
    cpu.esp -= DATA_BYTE;
    swaddr_write (cpu.esp, 4, cpu.eip + len, 2);   //ret的时候，新eip = 此时的eip+len，然后ret命令长度是1,运行完ret后eip再加上这个1,刚好是call的下一条指令
    //偏移量
    DATA_TYPE_S imm = op_src->val;
    cpu.eip += imm;
    print_asm("call $0x%x",cpu.eip + 1 + len);
    return 1 + len;
    //函数返回该指令长度之后，eip再加上该指令的长度len+1
}

make_helper(concat(call_rm_, SUFFIX)) {
	int len = concat(decode_rm_, SUFFIX) (eip + 1);
	cpu.esp -= DATA_BYTE;
	swaddr_write (cpu.esp , 4 , cpu.eip + len, 2);
	DATA_TYPE_S imm = op_src->val;
	print_asm("call $0x%x",imm);
	cpu.eip = imm - len - 1;
	return 1 + len;
	print_asm_template1();
}

// static void do_execute(){
//     cpu.esp -= 4;

//     //把该指令的下一条指令放入栈指针中
//     swaddr_write(cpu.esp, 4, cpu.eip + DATA_BYTE + 1);
    
//     //PC值更新为立即数的值（跳转）
//     if(op_src -> type == OP_TYPE_IMM){
//         cpu.eip += op_src -> val;
//         //printf("%d\n",op_src -> val);
//     }
        
//     else cpu.eip = op_src -> val - get_instr_len();

//     if(DATA_BYTE == 2)
//         cpu.eip &= 0xffff;
//     print_asm("call $0x%0x",cpu.eip + 1 + DATA_BYTE);
// }

// make_instr_helper(si)
// make_instr_helper(rm)

#include "cpu/exec/template-end.h"